"""
# -*- coding: utf-8 -*-
# @Time    : 2023/10/16 15:44
# @Author  : 王摇摆
# @FileName: file2.py
# @Software: PyCharm
# @Blog    ：https://blog.csdn.net/weixin_44943389?type=blog
"""

# 导入必要的库
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

# 读取数据
data = pd.read_csv('../dataset/train.csv')
test_data = pd.read_csv('../dataset/test.csv')
print('[1. 数据集加载完毕]')

# 分离特征和目标变量
X = data.drop(columns=['id', 'target'])
y = data['target']

test_X = test_data.drop(columns='id')

# 数据预处理，例如标准化
# 这里假设你的特征都是数值型的，如果有类别型变量需要进行相应处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)
test_X = scaler.transform(test_X)

# 初始化KNN分类器
knn_classifier = KNeighborsClassifier()

# 设置网格搜索的参数范围
param_grid = {'n_neighbors': [3, 5, 7], 'weights': ['uniform', 'distance']}

# 使用网格搜索来选择最佳的K值和权重方式
grid_search = GridSearchCV(knn_classifier, param_grid, cv=5)
grid_search.fit(X, y)

# 输出最佳参数
print('最佳参数:', grid_search.best_params_)

# 使用最佳参数的模型进行训练
best_knn_classifier = grid_search.best_estimator_
best_knn_classifier.fit(X, y)
print('[3. KNN模型训练完成]')

# 预测
y_pred = best_knn_classifier.predict(X=test_X)
print('[4. KNN模型预测完毕]\n')

# 预测结果输出
pd.DataFrame({'id': test_data['id'], 'target': y_pred}).to_csv('../result/KNN.csv', index=None)
print('[5. 预测结果已输出为CSV文件]')
